/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package alex;

/**
 *
 * @author Administrador
 */
public class Token {

    /* Variables de Instancia */
    public int token;
    public String lexema;
    public int NumeroLinea;

    /* Constantes para identificadar tokens   */
    public static final int IDENTIFICADOR = 0;

    public static final int OPSUMA = 1; // Este token agrupa los lexemas +, - y or
    public static final int OPMULT = 3; // Este token agrupa los lexemas *, div y and
    
    public static final int OPIGUAL = 4;
    public static final int OPDIST = 5;
    public static final int OPMENOR = 6;
    public static final int OPMAYOR = 7;
    public static final int OPMAYORIG = 8;
    public static final int OPMENORIG = 9;
    public static final int PARABRE = 10;
    public static final int PARCIERRA = 11;
    public static final int CORABRE = 12;
    public static final int CORCIERRA = 13;
    public static final int OPASIGN = 14;
    public static final int PUNTO = 15;
    public static final int COMA = 16;
    public static final int PUNTOCOMA = 17;
    public static final int DOSPUNTOS = 18;
    public static final int NUMERO = 19;
    public static final int IF = 20;
    public static final int THEN = 21;
    public static final int ELSE = 22;
    public static final int BEGIN = 23;
    public static final int END = 24;

    public static final int OPNOT = 28;
    public static final int OF = 29;
    public static final int WHILE = 30;
    public static final int DO = 31;
    public static final int CONST = 32;
    public static final int VAR = 33;
    public static final int TYPE = 34;
    public static final int ARRAY = 35;
    public static final int FUNCTION = 36;
    public static final int PROCEDURE = 37;
    public static final int PROGRAM = 38;
    public static final int PUNTOPUNTO = 39;

    public static final int EOF = -1;

    public void setNroLinea(int num) {
        NumeroLinea = num;
    }

    public Token(int Tok, String Lex, int Linea) {
        token = Tok;
        lexema = Lex;
        NumeroLinea = Linea;
    }

    public int getToken(){
        return token;
    }

    public String getLexema(){
        return lexema;
    }

    public int getLinea(){
        return NumeroLinea;
    }
    
    public String descripcionToken(){
        
        switch (getToken()){
            case IDENTIFICADOR:
                return "(Identificador)";
            case OPSUMA:
                if (getLexema().equals("+")){
                    return "(Operador suma)";
                }
                else if (getLexema().equals("-")){
                    return "(Operador resta)";
                }
                else { return "(Operador OR)"; }
            case OPMULT:
                if (getLexema().equals("*")){
                    return "(Operador producto)";
                }
                else if (getLexema().equals("div")){
                    return "(Operador DIV)";
                }
                else { return "(Operador AND)"; }
            case OPIGUAL:
                return "(Operador igual)";
            case OPDIST:
                return "(Operador distinto)";
            case OPMENOR:
                return "(Operador menor)";
            case OPMAYOR:
                return "(Operador mayor)";
            case OPMAYORIG:
                return "(Operador mayor o igual)";
            case OPMENORIG:
                return "(Operador menor o igual)";
            case PARABRE:
                return "(Parentesis que abre)";
            case PARCIERRA:
                return "(Parentesis que cierra)";
            case CORABRE:
                return "(Corchete que abra)";
            case CORCIERRA:
                return "(Corchete que cierra)";
            case OPASIGN:
                return "(Operador de asignacion)";
            case PUNTO:
                return "(Operador punto)";
            case COMA:
                return "(Operador coma)";
            case PUNTOCOMA:
                return "(Operador punto y coma)";
            case DOSPUNTOS:
                return "(Operador dos puntos)";
            case NUMERO:
                return "(Numero)";
            case IF:
                return "(Operador IF)";
            case THEN:
                return "(Operador THEN)";
            case ELSE:
                return "(Operador ELSE)";
            case BEGIN:
                return "(Operador BEGIN)";
            case END:
                return "(Operador END)";
            case OPNOT:
                return "(Operador NOT)";
            case OF:
                return "(Operador OF)";
            case WHILE:
                return "(Operador WHILE)";
            case DO:
                return "(Operador DO)";
            case CONST:
                return "(Operador CONST)";
            case VAR:
                return "(Operador VAR)";
            case TYPE:
                return "(Operador TYPE)";
            case ARRAY:
                return "(ARRAY)";
            case FUNCTION:
                return "(FUNCTION)";
            case PROCEDURE:
                return "(PROCEDURE)";
            case PROGRAM:
                return "(PROGRAM)";
        }
        
        return "Error, token no reconocido";
    }

    public boolean isToken(int Tok){
        return this.getToken() == Tok;
    }

}